一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。
输入格式:
输入在一行中给出一个正整数 N(1<N<2^31)。
输出格式:
首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按 因子1*因子2*……*因子k 的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。
输入样例:
输出样例:
思路
用start来记录连乘的第一个因子,len来记录连续因子的长度,都初始化为0。如果start遍历之后仍未0,说明n在2-sqrt(n)范围之内没有因子,即n为素数,直接输出1和n就行了;否则输出[tart,start+len]
注意判断素数情况
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
   | #include <iostream> #include <cmath> using namespace std; int main() { 	long n; 	cin >> n; 	int start = 0, len = 0; 	for(int i = 2; i <= sqrt(n); i++) { 		long tmp = 1; 		for(int j = i; j*tmp <= n; j++) { 			tmp *= j; 			if(n%tmp==0 && j-i+1>len) { 				start = i; 				len = j-i+1; 			} 		} 	} 	if(start == 0) cout << "1\n" << n; 	else { 		cout << len << endl << start; 		for(int i = start+1; i < start+len; i++) { 			cout << "*" << i; 		} 	} }
   | 
 
另一种版本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
   | #include <iostream> #include <vector>
  using namespace std;
  bool func(long n) {      if(n == 1) {         return false;     }     for(long i = 2; i * i <= n; i++) {          if(n % i == 0) {             return false;         }     }     return true; }
  int main() {     long n;     scanf("%ld", &n);     if(func(n)) {         printf("1\n");         printf("%d\n", n);         return 0;     }     vector<int> ret;     for(int i = 2; i * i <= n; i++) {         if(n % i == 0) {              vector<int> ve;              ve.push_back(i);             int t = n / i;              int j = i + 1;              while(t > 1 && t % j == 0) {                 ve.push_back(j);                 t = t / j;                 j++;             }             if(ve.size() > ret.size()) {                  ret = ve;             }         }     }     printf("%d\n", (int)ret.size());     for(int i = 0; i < (int)ret.size(); i++) {         printf("%d", ret[i]);         printf("%c", i == (int)ret.size() - 1 ? '\n' : '*');     }     return 0; }
   |